(function () {
    var defaultStr = '--';
    function getDefault (_default) {
        var res = defaultStr;
        if (_default !== undefined) {
            res = _default;
        }
        return res;
    }

    etpl.addFilter('dayFormat', function (value, format) {
        var date;
        if (isNaN(Number(value))) {
            return value;
        } else {
            date = new Date(Number(value));
        }
        var now = new Date(),
            today = new Date(now.getFullYear(), now.getMonth(), now.getDate());

        var time = date.getTime() - today.getTime();
        // 一天的毫秒数 1000 * 60 * 60 * 24 = 86400000
        if (time > 0) {
            if (time < 86400000) {
                value = '今天' + new Date(Number(value)).pattern(format.replace(/yyyy.*MM.*dd/, ''));
            } else if (time < 86400000 * 2) {
                value = '明天' + new Date(Number(value)).pattern(format.replace(/yyyy.*MM.*dd/, ''));
            } else {
                value = new Date(Number(value)).pattern(format);
            }
        } else {
            if (-time < 86400000) {
                value = '昨天' + new Date(Number(value)).pattern(format.replace(/yyyy.*MM.*dd/, ''));
            } else if (-time < 86400000 * 2) {
                value = '前天' + new Date(Number(value)).pattern(format.replace(/yyyy.*MM.*dd/, ''));
            } else {
                value = new Date(Number(value)).pattern(format);
            }
        }
        return value;
    });
    etpl.addFilter('dateFormat', function (value, format) {
        return value ? new Date(isNaN(Number(value)) ? value.replace(/\-/g, '/') : Number(value)).pattern(format) : '';
    });
    etpl.addFilter('default', function (value, _default) {
        return value || getDefault(_default);
    });
    etpl.addFilter('parseDefault', function (value, _default) {
        return value || getDefault(_default);
    });
    etpl.addFilter('parseBaseInfo', function (value, nameSpace, _default) {
        if (!mao.info.baseInfoMap[nameSpace]) {
            return value;
        }
        return value === undefined ? getDefault(_default) : mao.info.baseInfoMap[nameSpace][value.toString()] || getDefault(_default);
    });
    etpl.addFilter('stringify', function (value) {
        return JSON.stringify(value);
    });
    etpl.addFilter('parseRegion', function (value, symbol) {
        if (!value) {
            return value;
        }
        var city = ecui.ui.BCities.prototype.getCity(value.toString());
        return city.join(symbol || '-').trim();
    });
    etpl.addFilter('parseCity', function (value, symbol) {
        if (!value) {
            return value;
        }
        var city = ecui.ui.BCities.prototype.getCity(value.toString());
        return city.join(symbol || '-').trim();
    });

    etpl.addFilter('toFixed', function (value, digit) {
        if (typeof value !== 'number') {
            value = Number(value);
        }
        return value.toFixed(digit === 0 ? 0 : 2);
    });

    etpl.addFilter('fixed', function (value) {
        return Math.round(Number(value) * 100) / 100;
    });

    etpl.addFilter('parseRadioItem', function (source) {
        if (!source) {
            return source;
        }
        if (source instanceof Array) {
            return source.map(function (item) { return item instanceof ecui.ui.Control ? item._oItem : item });
        }
        return source._oItem instanceof ecui.ui.Control ? source._oItem : source;
    });
    etpl.addFilter('sumPrice', function (source, key) {
        if (!source || !(source instanceof Array)) {
            return source;
        }
        return source.reduce(function (a, b) { return a + Number(b[key]) }, 0);
    });

    etpl.addFilter('options', function (value) {
        return encodeURIComponent(value.replace(/%/g, '%25')).replace(/;/g, '%3B');
    });
    // 数据为空时用 --代替
    etpl.addFilter('parseBr', function (value) {
        return value.replace(/\n/g, '<br/>');
    });
    // 演出日志解析链接中的参数
    etpl.addFilter('parseLink', function (value, data) {
        return value.replace(/(\${.+?})/g, function (item) {
            return data[item.slice(2, item.length - 1)]
        })        
    });
    /**
     * 金融格式化filter
     *
     * @param {string} source 源串
     * @return {string} 替换结果串
     */
    etpl.addFilter('finance', mao.util.formatFinance);
    // 数组字段join处理
    etpl.addFilter('joinArr', function (source, key, symbol, _default) {
        if (!(source instanceof Array)) {
            var str = source !== undefined ? source : '';
            if (_default !== undefined) {
                str = _default;
            }
            return str;
        }
        return source.map(function (item) {
            return key !== undefined ? item[key] : item;
        }).join(symbol || ',');
    });
}());